非負整數(0、正整數)
分組決定每組有幾個數字
例如:每組有10個數字
用除法對數字進行分組
例如:數字42,第4組第2個
42 / 10 = 4
42 % 10 = 2
| 第幾組 | 編碼 |
|---|---|
| 第0組 | 0 |
| 第1組 | 10 |
| 第2組 | 110 |
| 第3組 | 1110 |
| 第4組 | 11110 |
每組10個,可能的餘數為0 ~ 9
使用二進位編碼
| 第幾個 | 編碼 |
|---|---|
| 第0個 | 0000 |
| 第1個 | 0001 |
| 第2個 | 0010 |
| 第3個 | 0011 |
| 第4個 | 0100 |
| 第5個 | 0101 |
| 第6個 | 0110 |
| 第7個 | 0111 |
| 第8個 | 1000 |
| 第9個 | 1001 |
| 1010 | |
| 1011 | |
| 1100 | |
| 1101 | |
| 1110 | |
| 1111 |
用4bit去編碼,有的編碼沒有使用到
因為4bit編碼沒有全部用完
有的數字以3bit編碼
有的數字以4bit編碼
沒用到的編碼的數量 2^4 - 10 = 6
前6個數字(0 到 5) 以3bit編碼
其他數字,仍然以4bit編碼
| 第幾個 | 編碼 |
|---|---|
| 第0個 | 000 |
| 第1個 | 001 |
| 第2個 | 010 |
| 第3個 | 011 |
| 第4個 | 100 |
| 第5個 | 101 |
| 第6個 | 0110 |
| 第7個 | 0111 |
| 第8個 | 1000 |
| 第9個 | 1001 |
解碼的時候,先讀取3bit
如果3bit的數值小於沒有使用的空間 6
第幾個 = 3bit的數值
否則
需要再讀取1bit
現在的問題是:4bit數字的前3bit小於6
在解碼的時候,它就不會再讀取1bit
解法:使用別的4bit數字新的4bit數字 = 舊的4bit數字 + 6
| 第幾個 | 編碼 |
|---|---|
| 第0個 | 000 |
| 第1個 | 001 |
| 第2個 | 010 |
| 第3個 | 011 |
| 第4個 | 100 |
| 第5個 | 101 |
| 0110 | |
| 0111 | |
| 1000 | |
| 1001 | |
| 1010 | |
| 1011 | |
| 第6個 | 1100 |
| 第7個 | 1101 |
| 第8個 | 1110 |
| 第9個 | 1111 |
數字42,它位於第4組第2個
它的格倫布編碼
11110010
先看看有幾個1
遇到0之前,總共有幾個1
每組個數 = 10
10不是2的次方(例如:2^1、2^2、2^3)
位於 2^3 到 2^4 之間
使用3bit或4bit編碼
沒有使用的空間 = 2^4 - 10 = 6
先讀取3bit的數值
如果3bit的數值小於沒有使用的空間 6
第幾個 = 3bit的數值
否則
再讀取1bit
第幾個 = 4bit的數值 - 沒有使用的空間 6
11110010
原數字 = 第4組 * 每組個數 10 + 第2個 = 42
數字 → 第幾個數字
以數字9為例
它是第10個數字(最前面的數字是0)
10的二進位是 1010
補0
最高位bit 一定是1
其他位bit的長度 3
在1010前面補3個0
補3個0的意思
在解碼的時候
遇到1之後,要繼續讀取3bit
表示數字9位於第3組
數字9的指數哥倫布編碼為
0001010
| 數字 | 編碼 |
|---|---|
| 0 | 1 |
| 1 | 010 |
| 2 | 011 |
| 3 | 00100 |
| 4 | 00101 |
| 5 | 00110 |
| 6 | 00111 |
| 7 | 0001000 |
| 8 | 0001001 |
| 9 | 0001010 |
| 10 | 0001011 |
| 11 | 0001100 |
| 12 | 0001101 |
| 13 | 0001110 |
| 14 | 0001111 |
| 15 | 000010000 |
| 第幾組 | 個數 |
|---|---|
| 第0組 | 1個 |
| 第1組 | 2個 |
| 第2組 | 4個 |
| 第3組 | 8個 |
| 第4組 | 16個 |
每組第0個的指數哥倫步編碼| 第幾組 | 編碼 |
|---|---|
| 第0組 | 1 |
| 第1組 | 010 |
| 第2組 | 00100 |
| 第3組 | 0001000 |
| 第4組 | 000010000 |
第2組第0個 = 第4個數字
100 = (第1組個數 + 第0組個數) + 1
= (2^1 + 2^0) + 1
= 4
第3組第0個 = 第8個數字
1000 = (第2組個數 + 第1組個數 + 第0組個數) + 1
= (2^2 + 2^1 + 2^0) + 1
= 8
數字9的指數哥倫布編碼為
0001010
遇到1之前,總共有幾個0
3個0表示
遇到1之後,要繼續讀取3bit
1010(二進位) = 10(十進位)
第10個數字 = 數字9
10 - 1 = 9
0階指數哥倫布編碼前面介紹的,就是0階指數哥倫布編碼
數字9的0階指數哥倫布編碼為
0001010
1階指數哥倫布編碼以數字9為例
先轉成二進位
1001
因為是1階,把最低1bit暫時刪除
100
把100去做0階指數哥倫布編碼
100 → 數字4 → 第5個數字 → 101
補0之後,得到 00101
把刪除的1bit補回來
數字9的1階指數哥倫布編碼001011
解碼
遇到1之前,總共有幾個0
讀取了001
總共有2個0
本來要繼續讀取2bit
但是,因為它是1階指數哥倫布編碼
所以,遇到1之後,繼續讀取 (2 + 1) bit
讀取的結果為001011
解碼方法1001011
↓ 暫時刪除1bit00101
↓ 減100100
↓ 補回1bit001001
↓
9
解碼方法2001011 (二進位) = 11 (十進位)
因為是1階指數哥倫布編碼
11 - 2^1 = 9
0階vs1階指數哥倫布編碼| 數字 | 0階 | 1階 |
|---|---|---|
| 0 | 1 |
10 |
| 1 | 010 |
11 |
| 2 | 011 |
0100 |
| 3 | 00100 |
0101 |
| 4 | 00101 |
0110 |
| 5 | 00110 |
0111 |
| 6 | 00111 |
001000 |
| 7 | 0001000 |
001001 |
| 8 | 0001001 |
001010 |
| 9 | 0001010 |
001011 |
| 10 | 0001011 |
001100 |
| 11 | 0001100 |
001101 |
| 12 | 0001101 |
001110 |
| 13 | 0001110 |
001111 |
| 14 | 0001111 |
00010000 |
| 15 | 000010000 |
00010001 |